package negocio;

import datos.Contrato;
import datos.Domicilio;
import datos.EmpresaContratista;
import datos.EstadoObra;
import datos.Localidad;
import datos.Localizacion;
import datos.ModalidadContratacion;
import datos.Obra;
import datos.Pais;
import datos.PeriodoCertificacion;
import datos.Programa;
import datos.ResponsableObra;
import datos.SubtipoObra;
import datos.TipoDocumento;
import datos.TipoObra;
import java.math.BigDecimal;
import java.net.URL;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */
@Stateless
public class GestorObraBean implements GestorObraRemote, GestorObraLocal {

    static Logger logger = Logger.getLogger(GestorObraBean.class);

    public static void log4j(Exception e){
        URL url = GestorObraBean.class.getResource("/configuracion/log4j.properties");
        PropertyConfigurator.configure(url);
        logger.error(e);
    }

//    public static String getStackTrace(Exception ex) {
//        java.io.StringWriter out = new java.io.StringWriter();
//        ex.printStackTrace(new java.io.PrintWriter(out));
//        String stackTrace = out.toString();
//        return stackTrace;
//    }


    @PersistenceContext
    private EntityManager em;

    /***
     * Retorna una lista de todos los países encontrados
     * @return lista con todos los paises ordenados por nombre almacenados en la base de datos
     * y null en caso contario
     * interfaz local
     */
    public List paises() {
        try {
            javax.persistence.Query q = em.createNamedQuery("Pais.encontrarTodosPaises");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de todos los países encontrados
     * @return lista con todos los paises ordenados por nombre almacenados en la base de datos
     * y null en caso contario
     * interfaz remota
     */
    public List paisesRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("Pais.encontrarTodosPaises");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna un objeto de tipo Pais que coincida con el parámetro nombre
     * @param nombre
     * @return pais con nombre igual a nombre y null en caso contario
     * interfaz local
     */
    public Pais encontrarPais(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Pais.findByNombre");
            q.setParameter("nombre", nombre);
            return (Pais) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna un objeto de tipo Pais que coincida con el parámetro nombre
     * @param nombre
     * @return pais con nombre igual a nombre y null en caso contario
     * interfaz remota
     */
    public Pais encontrarPaisRemote(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Pais.findByNombre");
            q.setParameter("nombre", nombre);
            return (Pais) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna una lista de provincias pertenecientes a un país
     * @param idPais
     * @return lista con las provincias con ID pais igual a idPais
     * y null en caso contrario
     * interfaz local
     */
    public List provinciasPorPais(int idPais) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Provincia.encontrarProvinciasPorPais");
            q.setParameter("idPais", idPais);
            return q.getResultList();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de provincias pertenecientes a un país
     * @param idPais
     * @return lista con las provincias con ID pais igual a idPais
     * y null en caso contrario
     * interfaz remota
     */
    public List provinciasPorPaisRemote(int idPais) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Provincia.encontrarProvinciasPorPais");
            q.setParameter("idPais", idPais);
            return q.getResultList();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de departamentos pertenecientes a una provincia
     * @param idProvincia
     * @return lista con aquellos departamentos con ID provincia igual a idProvincia
     * y null en caso contrario
     * interfaz local
     */
    public List departamentosPorProvincia(int idProvincia) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Departamento.encontrarDepartamentosPorProvincia");
            q.setParameter("idProvincia", idProvincia);
            return q.getResultList();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de departamentos pertenecientes a una provincia
     * @param idProvincia
     * @return lista con aquellos departamentos con ID provincia igual a idProvincia
     * y null en caso contrario
     * interfaz remota
     */
    public List departamentosPorProvinciaRemote(int idProvincia) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Departamento.encontrarDepartamentosPorProvincia");
            q.setParameter("idProvincia", idProvincia);
            return q.getResultList();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de localidades pertenecientes a un departamento
     * @param idDepartamento
     * @return lista con todas las Localidades con ID departamento igual a idDepartamento
     * y null en caso contrario
     * interfaz local
     */
    public List localidadesPorDepartamento(int idDepartamento) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Localidad.encontrarLocalidadesPorDepartamento");
            q.setParameter("idDpto", idDepartamento);
            return q.getResultList();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de localidades pertenecientes a un departamento
     * @param idDepartamento
     * @return lista con todas las Localidades con ID departamento igual a idDepartamento
     * y null en caso contrario
     * interfaz remota
     */
    public List localidadesPorDepartamentoRemote(int idDepartamento) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Localidad.encontrarLocalidadesPorDepartamento");
            q.setParameter("idDpto", idDepartamento);
            return q.getResultList();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de localidades cuyo nombre coincida con el parámetro nombreLoc
     * @param nombreLoc
     * @return lista de las Localidades con nombre como nombreLoc ordenadas por nombre y null en caso contrario
     * interfaz local
     */
    public List encontrarLocalidadesPorNombre(String nombreLoc) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Localidad.findByNombre");
            q.setParameter("nombre", nombreLoc);
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de localidades cuyo nombre coincida con el parámetro nombreLoc
     * @param nombreLoc
     * @return lista de las Localidades con nombre como nombreLoc ordenadas por nombre y null en caso contrario
     * interfaz remota
     */
    public List encontrarLocalidadesPorNombreRemote(String nombreLoc) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Localidad.findByNombre");
            q.setParameter("nombre", nombreLoc);
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna un objeto de tipo Localidad cuyo Id coincida con el parámetro idLoc
     * @param idLoc
     * @return localidad con ID igual a idLoc y null en caso contrario
     * intrerfaz local
     */
    public Localidad encontrarLocalidadPorId(int idLoc) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Localidad.findById");
            q.setParameter("id", idLoc);
            return (Localidad) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    public Pais encontrarPaisPorId (int idPaisEnc){
        try{
            javax.persistence.Query q = em.createNamedQuery("Pais.findById");
            q.setParameter("id", idPaisEnc);
            return (Pais) q.getSingleResult();

        }catch (Exception exc){
            GestorObraBean.log4j(exc);
            return null;

        }
    }
    /***
     * Retorna un objeto de tipo Localidad cuyo id coincida con el parámetro idLoc
     * @param idLoc
     * @return localidad con ID igual a idLoc y null en caso contrario
     * intrerfaz remota
     */
    public Localidad encontrarLocalidadPorIdRemote(int idLoc) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Localidad.findById");
            q.setParameter("id", idLoc);
            return (Localidad) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todos los Tipos de Documentos
     * @return lista de todos los Tipos de documentos almacenados en la base de datos
     * y null en caso contrario
     * interfaz local
     */
    public List tiposDocumeto() {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoDocumento.encontrarTodosTipo");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todos los Tipos de Documentos
     * @return lista de todos los Tipos de documentos almacenados en la base de datos
     * y null en caso contrario
     * interfaz remota
     */
    public List tiposDocumetoRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoDocumento.encontrarTodosTipo");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna un objeto Tipo de Documento cuyo nombre coincida con el parámetro nombre
     * @param nombre
     * @return tipo de documento con tipo igual a nombre y null en caso contrario
     * interfaz local
     */
    public TipoDocumento encontrarTipoDocumento(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoDocumento.findByTipo");
            q.setParameter("tipo", nombre);
            return (TipoDocumento) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna un objeto Tipo de Documento cuyo nombre coincida con el parámetro nombre
     * @param nombre
     * @return tipo de documento con tipo igual a nombre y null en caso contrario
     * interfaz remota
     */
    public TipoDocumento encontrarTipoDocumentoRemote(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoDocumento.findByTipo");
            q.setParameter("tipo", nombre);
            return (TipoDocumento) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna un objeto ModalidadContratacion cuyo nombre coincida con el parámetro nombre
     * @param nombre
     * @return la modalidad de contratacion cuyo nombre sea igual a nombre y null en caso contrario
     * interfaz local
     */
    public ModalidadContratacion encontrarModalidadContratacion(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("ModalidadContratacion.findByNombre");
            q.setParameter("nombre", nombre);
            return (ModalidadContratacion) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna un objeto ModalidadContratacion cuyo nombre coincida con el parámetro nombre
     * @param nombre
     * @return la modalidad de contratacion cuyo nombre sea igual a nombre y null en caso contrario
     * interfaz remota
     */
    public ModalidadContratacion encontrarModalidadContratacionRemote(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("ModalidadContratacion.findByNombre");
            q.setParameter("nombre", nombre);
            return (ModalidadContratacion) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna un objeto EmpresaContratista cuya razon social coincida con el parámetro razon
     * @param razon
     * @return empresa cuya razon social sea igual a  razon y null en caso contrario
     * interfaz local
     */
    public EmpresaContratista encontrarEmpresa(String razon) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.findByRazonSocial");
            q.setParameter("razon", razon);
            return (EmpresaContratista) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna un objeto EmpresaContratista cuya razon social coincida con el parámetro razon
     * @param razon
     * @return empresa cuya razon social sea igual a  razon y null en caso contrario
     * interfaz remota
     */
    public EmpresaContratista encontrarEmpresaRemote(String razon) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.findByRazonSocial");
            q.setParameter("razon", razon);
            return (EmpresaContratista) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna un objeto Contrato cuyo idEmpresaContratista e idObra coincidan con los parámetros idEmpresa e idObra respectivamente
     * @param idEmpresa
     * @param idObra
     * @return contrato cuyo ID de Empresa sea igual a idEmpresa e ID de Obra sea
     * igual a idObra y null en caso contrario
     * interfaz local
     */
    public Contrato encontrarContratoPorEmpresa(int idEmpresa, int idObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Contrato.encontrarContratoPorEmpresa");
            q.setParameter("idEmpresaContratista", idEmpresa);
            q.setParameter("idObra", idObra);
            return (Contrato) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna un objeto Contrato cuyo idEmpresaContratista e idObra coincidan con los parámetros
     * idEmpresa e idObra respectivamente
     * @param idEmpresa
     * @param idObra
     * @return contrato cuyo ID de Empresa sea igual a idEmpresa e ID de Obra sea
     * igual a idObra y null en caso contrario
     * interfaz remota
     */
    public Contrato encontrarContratoPorEmpresaRemote(int idEmpresa, int idObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Contrato.encontrarContratoPorEmpresa");
            q.setParameter("idEmpresaContratista", idEmpresa);
            q.setParameter("idObra", idObra);
            return (Contrato) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Actualiza los atributos del Contrato de una Obra, retornando true en caso de éxito y Null en caso contrario
     * @param idObra
     * @param idEmpresa
     * @param fechaContrato
     * @param tituloContrato
     * @param plazo
     * @param tipoPlazo
     * @param periodoContrato
     * @param observacionesContrato
     * @return true si encuentra una Obra con ID igual a idObra, Empresa Contratista con ID igual a idEmpresa
     * y un Contrato con ID empresa contratista igual a idEmpresa y ID obra igual a idObra; se modifican y actualizan
     * exitosamente sus atributos en la base de datos y null en caso contrario
     * interfaz local
     */
    public boolean modificarContratoDeObra(int idObra, int idEmpresa, Date fechaContrato, String tituloContrato,
            String plazo, String tipoPlazo, String periodoContrato, String observacionesContrato) {
        try {
            Obra obra = em.find(Obra.class, idObra);
            EmpresaContratista emp = em.find(EmpresaContratista.class, idEmpresa);
            Contrato contrato = this.encontrarContratoPorEmpresa(idEmpresa, idObra);
            if (contrato == null) {
                contrato = new Contrato();
            }
            contrato.setFecha(fechaContrato);
            contrato.setIdEmpresaContratista(emp);
            contrato.setPlazo(plazo.toUpperCase());
            contrato.setTipoPlazo(tipoPlazo.toUpperCase());
            PeriodoCertificacion perioCert = this.encontrarPeriodoCertificacion(periodoContrato.toUpperCase());
            contrato.setIdPeriodoCertificacion(perioCert);
            contrato.setObservaciones(observacionesContrato.toUpperCase());
            contrato.setTitulo(tituloContrato.toUpperCase());
            contrato.setIdObra(obra);
            persist(contrato);
            em.flush();
            return true;
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Actualiza los atributos del Contrato de una Obra, retornando true en caso de éxito y Null en caso contrario
     * @param idObra
     * @param idEmpresa
     * @param fechaContrato
     * @param tituloContrato
     * @param plazo
     * @param tipoPlazo
     * @param periodoContrato
     * @param observacionesContrato
     * @return true si encuentra una Obra con ID igual a idObra, Empresa Contratista con ID igual a idEmpresa
     * y un Contrato con ID empresa contratista igual a idEmpresa y ID obra igual a idObra; se modifican y actualizan
     * exitosamente sus atributos en la base de datos y null en caso contrario
     * interfaz remota
     */
    public boolean modificarContratoDeObraRemote(int idObra, int idEmpresa, Date fechaContrato, String tituloContrato,
            String plazo, String tipoPlazo, String periodoContrato, String observacionesContrato) {
        try {
            Obra obra = em.find(Obra.class, idObra);
            EmpresaContratista emp = em.find(EmpresaContratista.class, idEmpresa);
            Contrato contrato = this.encontrarContratoPorEmpresa(idEmpresa, idObra);
            if (contrato == null) {
                contrato = new Contrato();
            }
            contrato.setFecha(fechaContrato);
            contrato.setIdEmpresaContratista(emp);
            contrato.setPlazo(plazo.toUpperCase());
            contrato.setTipoPlazo(tipoPlazo.toUpperCase());
            PeriodoCertificacion perioCert = this.encontrarPeriodoCertificacion(periodoContrato.toUpperCase());
            contrato.setIdPeriodoCertificacion(perioCert);
            contrato.setObservaciones(observacionesContrato.toUpperCase());
            contrato.setTitulo(tituloContrato.toUpperCase());
            contrato.setIdObra(obra);
            persist(contrato);
            em.flush();
            return true;
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Retorna una lista con todos los nombres de las distintas Modalidades de Contratación
     * @return lista de todos los nombres ordenados de las modalidades de contratacion almacenados
     * en la base de datos, y null en caso contrario
     * interfaz remota
     */
    public List modalidadesContratacionRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("ModalidadContratacion.encontrarTodosNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todos los nombres de las distintas Modalidades de Contratación existentes
     * @return lista de todos los nombres ordenados de las modalidades de contratacion almacenados
     * en la base de datos, y null en caso contrario
     * interfaz local
     */
    public List modalidadesContratacion() {
        try {
            javax.persistence.Query q = em.createNamedQuery("ModalidadContratacion.encontrarTodosNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de razon social de Empresas Contratistas existentes
     * @return lista de razon social ordenadas de todas las empresas contratistas almacenadas
     * en la base de datos, y null en caso contrario
     * interfaz local
     */
    public List empresasContratistas() {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.encontrarTodosNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de razon social de Empresas Contratistas existentes
     * @return lista de razon social ordenadas de todas las empresas contratistas almacenadas
     * en la base de datos, y null en caso contrario
     * interfaz remota
     */
    public List empresasContratistasRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.encontrarTodosNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de todas las Empresas Contratistas existentes
     * @return lista con todas las empresas contratistas almacenadas
     * en la base de datos y null en caso contrario
     * interfaz local
     */
    public List empresas() {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.findAll");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de todas las Empresas Contratistas existentes
     * @return lista con todas las empresas contratistas almacenadas
     * en la base de datos y null en caso contrario
     * interfaz remota
     */
    public List empresasRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.findAll");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }


    /**
     * Retorna una lista con todos los posibles estados que pueden tener las instancias de Contrato.
     * @return lista con todos los estados de contrato un objeto
     * de tipo Contrato.
     */
    public List estadosContrato() {
        try {
            javax.persistence.Query q = em.createNamedQuery("EstadoContrato.encontrarTodosEstadosContrato");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /**
     * Retorna una lista con todos los posibles estados que pueden tener las instancias de Contrato.
     * @return lista con todos los estados de contrato un objeto
     * de tipo Contrato.
     */
    public List estadosContratoRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("EstadoContrato.encontrarTodosEstadosContrato");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de todos los Periodos de Certificacion ordenados por nombre
     * @return lista con todos los nombres ordenados de los períodos de certificacion
     * y null en caso contrario
     * interfaz local
     */
    public List periodosCertificacion() {
        try {
            javax.persistence.Query q = em.createNamedQuery("PeriodoCertificacion.encontrarTodosPeriodoCertificacion");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista de todos los Periodos de Certificacion ordenados por nombre
     * @return lista con todos los nombres ordenados de los períodos de certificacion
     * y null en caso contrario
     * interfaz remota
     */
    public List periodosCertificacionRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("PeriodoCertificacion.encontrarTodosPeriodoCertificacion");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna un objeto de tipo PeriodoCertificacion cuyo nombre coincida con el parametro nombre
     * @param nombre
     * @return instancia de periodo de certificacion con nombre igual a "nombre"
     * y null en caso contrario
     * interfaz local
     */
    public PeriodoCertificacion encontrarPeriodoCertificacion(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("PeriodoCertificacion.findByNombre");
            q.setParameter("nombre", nombre);
            return (PeriodoCertificacion) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna un objeto de tipo PeriodoCertificacion cuyo nombre coincida con el parametro nombre
     * @param nombre
     * @return instancia de periodo de certificacion con nombre igual a "nombre"
     * y null en caso contrario
     * interfaz remota
     */
    public PeriodoCertificacion encontrarPeriodoCertificacionRemote(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("PeriodoCertificacion.findByNombre");
            q.setParameter("nombre", nombre);
            return (PeriodoCertificacion) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }

    }

    /***
     *
     * @param object
     */
    public void persist(Object object) {
        em.persist(object);
    }

    /***
     * Agrega un nuevo objeto de tipo Obra, con atributos y referencias a clases relacionadas,
     * en la base de datos. Retornando el idObra en caso de éxito y -1 en caso contrario.
     * @param codigo
     * @param anticipo
     * @param descripcion
     * @param fechaInicioEst
     * @param fechaInicioReal
     * @param fechaFinEst
     * @param fechaFinReal
     * @param estado
     * @param modalidad
     * @param programa
     * @param idTipoObra
     * @param idSubtipoObra
     * @param montoTotal
     * @param nombre
     * @param numeroExp
     * @param observaciones
     * @param nroResolucion
     * @param fondos
     * @param cuitEmp
     * @param mailEmp
     * @param paginaEmp
     * @param telefonoEmp
     * @param razonEmp
     * @param paisEmp
     * @param barrioEmp
     * @param calleEmp
     * @param codPostalEmp
     * @param deptoEmp
     * @param numeroCalleEmp
     * @param pisoEmp
     * @param apellidoRes
     * @param nombreRes
     * @param dniRes
     * @param tipoDniRes
     * @param barrioRes
     * @param calleRes
     * @param codPostalRes
     * @param deptoRes
     * @param numeroCalleRes
     * @param pisoRes
     * @param fechaContrato
     * @param tituloContrato
     * @param plazo
     * @param tipoPlazo
     * @param periodoContrato
     * @param observacionesContrato
     * @param calleGeo
     * @param nroCalleGeo
     * @param barrioGeo
     * @param idLocalidadGeo
     * @param latitudGeo
     * @param longitudGeo
     * @param zoomGeo
     * @return ID de obra que ha sido persistida, con atributos y referencias a clases relacionadas,
     * en la base de datos exitosamente y -1 en caso contrario
     * interfaz local
     */
    public int agregarObra(String codigo, BigDecimal anticipo, String descripcion, Date fechaInicioEst,
            Date fechaInicioReal, Date fechaFinEst, Date fechaFinReal, String estado, String modalidad, String programa,
            int idTipoObra, int idSubtipoObra, BigDecimal montoTotal, String nombre, int numeroExp, String observaciones,
            String nroResolucion, String fondos, String cuitEmp, String mailEmp, String paginaEmp, String telefonoEmp,
            String razonEmp, String paisEmp, String barrioEmp, String calleEmp,
            String codPostalEmp, String deptoEmp, String numeroCalleEmp, int pisoEmp,
            String apellidoRes, String nombreRes, int dniRes, String tipoDniRes, String barrioRes, String calleRes,
            String codPostalRes, String deptoRes, String numeroCalleRes, int pisoRes, Date fechaContrato, String tituloContrato,
            String plazo, String tipoPlazo, String periodoContrato, String observacionesContrato, String calleGeo, String nroCalleGeo,
            String barrioGeo, int idLocalidadGeo, String latitudGeo, String longitudGeo, int zoomGeo, int idLocalidadEnc, int idPaisEnc) {
        try {
            Obra obra = new Obra();
            obra.setAnticipoFinanciero(anticipo);
            obra.setCodigo(codigo.toUpperCase());
            obra.setDescripcion(descripcion.toUpperCase());
            obra.setFechaFinEstimada(fechaFinEst);
            obra.setFechaFinReal(fechaFinReal);
            obra.setFechaInicioEstimada(fechaInicioEst);
            obra.setFechaInicioReal(fechaInicioReal);


            //NO PONER REFERENCIAS A OTRO EJB DESDE UN EJB PORQUE
            //TIENE PROBLEMAS CON LA PERSISTENCIA


            EstadoObra eo = this.encontrarEstadoObra(estado);
            obra.setIdEstado(eo);


            Localizacion geo = new Localizacion();
            geo.setLatitud(latitudGeo);
            geo.setLongitud(longitudGeo);
            geo.setBarrio(barrioGeo.toUpperCase());
            geo.setCalle(calleGeo.toUpperCase());
            geo.setNumero(nroCalleGeo);
            geo.setZoom(zoomGeo);
            Localidad loc = this.encontrarLocalidadPorId(idLocalidadGeo);
            geo.setIdLocalidad(loc);
            persist(geo);
            obra.setIdLocalizacion(geo);


            ModalidadContratacion mo = encontrarModalidadContratacion(modalidad);
            obra.setIdModalidadContratacion(mo);
            Programa p = this.encontrarPrograma(programa);
            obra.setIdPrograma(p);

            TipoObra t = em.find(TipoObra.class, idTipoObra);
            obra.setIdTipoObra(t);
            SubtipoObra st = em.find(SubtipoObra.class, idSubtipoObra);
            obra.setIdSubtipoObra(st);

            obra.setMontoTotal(montoTotal);
            obra.setNombre(nombre.toUpperCase());
            obra.setNumeroExpediente(numeroExp);
            obra.setObservaciones(observaciones.toUpperCase());

            obra.setNroResolucion(nroResolucion.toUpperCase());
            obra.setFondos(fondos.toUpperCase());

            EmpresaContratista emp = this.encontrarEmpresa(razonEmp);
            Domicilio domEmp;
            if (emp == null) {
                emp = new EmpresaContratista();
                domEmp = new Domicilio();
            } else {
                domEmp = emp.getIdDomicilio();
            }
            emp.setCuit(cuitEmp);
            emp.setEmail(mailEmp.toUpperCase());
            emp.setPaginaWeb(paginaEmp.toUpperCase());
            emp.setTelefono(telefonoEmp);
            emp.setRazonSocial(razonEmp.toUpperCase());
            Pais pais = encontrarPais(paisEmp);
            emp.setIdPais(pais);
            domEmp.setBarrio(barrioEmp.toUpperCase());
            domEmp.setCalle(calleEmp.toUpperCase());
            domEmp.setCodPostal(codPostalEmp.toUpperCase());
            domEmp.setDepto(deptoEmp.toUpperCase());
            domEmp.setNumero(numeroCalleEmp);
            domEmp.setPiso(pisoEmp);
            persist(domEmp);
            emp.setIdDomicilio(domEmp);
            persist(emp);

            ResponsableObra respon = new ResponsableObra();
            respon.setApellido(apellidoRes.toUpperCase());
            respon.setNombre(nombreRes.toUpperCase());
            respon.setNumeroDocumento(dniRes);
            respon.setIdEmpresa(emp);
            TipoDocumento td = encontrarTipoDocumento(tipoDniRes.toUpperCase());
            respon.setIdTipoDocumento(td);

            Domicilio domRes = new Domicilio();
            domRes.setBarrio(barrioRes.toUpperCase());
            domRes.setCalle(calleRes.toUpperCase());
            domRes.setCodPostal(codPostalRes.toUpperCase());
            domRes.setDepto(deptoRes.toUpperCase());
            domRes.setNumero(numeroCalleRes);
            domRes.setPiso(pisoRes);
            Localidad localidadRes = em.find(datos.Localidad.class, idLocalidadEnc);
            domRes.setIdLocalidad(localidadRes);
            Pais paisRes = em.find(datos.Pais.class, idPaisEnc);
            domRes.setIdPais(paisRes);
            persist(domRes);

            respon.setIdDomicilio(domRes);
            persist(respon);

            obra.setIdResponsable(respon);
            obra.setIdEmpresa(emp);
            persist(obra);

            Contrato contrato = new Contrato();
            contrato.setFecha(fechaContrato);
            contrato.setIdEmpresaContratista(emp);
            contrato.setPlazo(plazo.toUpperCase());
            contrato.setTipoPlazo(tipoPlazo.toUpperCase());
            PeriodoCertificacion perioCert = this.encontrarPeriodoCertificacion(periodoContrato.toUpperCase());
            contrato.setIdPeriodoCertificacion(perioCert);
            contrato.setObservaciones(observacionesContrato.toUpperCase());
            contrato.setTitulo(tituloContrato.toUpperCase());
            contrato.setIdObra(obra);
            persist(contrato);

            em.flush();
            return obra.getId();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return -1;
        }
    }

    /***
     * Agrega un nuevo objeto de tipo Obra, con atributos y referencias a clases relacionadas,
     * en la base de datos. Retornando el idObra en caso de éxito y -1 en caso contrario.
     * @param codigo
     * @param anticipo
     * @param descripcion
     * @param fechaInicioEst
     * @param fechaInicioReal
     * @param fechaFinEst
     * @param fechaFinReal
     * @param estado
     * @param modalidad
     * @param programa
     * @param idTipoObra
     * @param idSubtipoObra
     * @param montoTotal
     * @param nombre
     * @param numeroExp
     * @param observaciones
     * @param nroResolucion
     * @param fondos
     * @param cuitEmp
     * @param mailEmp
     * @param paginaEmp
     * @param telefonoEmp
     * @param razonEmp
     * @param paisEmp
     * @param barrioEmp
     * @param calleEmp
     * @param codPostalEmp
     * @param deptoEmp
     * @param numeroCalleEmp
     * @param pisoEmp
     * @param apellidoRes
     * @param nombreRes
     * @param dniRes
     * @param tipoDniRes
     * @param barrioRes
     * @param calleRes
     * @param codPostalRes
     * @param deptoRes
     * @param numeroCalleRes
     * @param pisoRes
     * @param fechaContrato
     * @param tituloContrato
     * @param plazo
     * @param tipoPlazo
     * @param periodoContrato
     * @param observacionesContrato
     * @param calleGeo
     * @param nroCalleGeo
     * @param barrioGeo
     * @param idLocalidadGeo
     * @param latitudGeo
     * @param longitudGeo
     * @param zoomGeo
     * @return ID de obra que ha sido persistida, con atributos y referencias a clases relacionadas,
     * en la base de datos exitosamente y -1 en caso contrario
     * interfaz remota
     */
    public int agregarObraRemote(String codigo, BigDecimal anticipo, String descripcion, Date fechaInicioEst,
            Date fechaInicioReal, Date fechaFinEst, Date fechaFinReal, String estado, String modalidad, String programa,
            int idTipoObra, int idSubtipoObra, BigDecimal montoTotal, String nombre, int numeroExp, String observaciones,
            String nroResolucion, String fondos, String cuitEmp, String mailEmp,
            String paginaEmp, String telefonoEmp, String razonEmp, String paisEmp, String barrioEmp, String calleEmp,
            String codPostalEmp, String deptoEmp, String numeroCalleEmp, int pisoEmp,
            String apellidoRes, String nombreRes, int dniRes, String tipoDniRes, String barrioRes, String calleRes,
            String codPostalRes, String deptoRes, String numeroCalleRes, int pisoRes, Date fechaContrato, String tituloContrato,
            String plazo, String tipoPlazo, String periodoContrato, String observacionesContrato, String calleGeo, String nroCalleGeo,
            String barrioGeo, int idLocalidadGeo, String latitudGeo, String longitudGeo, int zoomGeo, int idLocalidadEnc, int idPaisEnc) {
        try {
            Obra obra = new Obra();
            obra.setAnticipoFinanciero(anticipo);
            obra.setCodigo(codigo.toUpperCase());
            obra.setDescripcion(descripcion.toUpperCase());
            obra.setFechaFinEstimada(fechaFinEst);
            obra.setFechaFinReal(fechaFinReal);
            obra.setFechaInicioEstimada(fechaInicioEst);
            obra.setFechaInicioReal(fechaInicioReal);


            //NO PONER REFERENCIAS A OTRO EJB DESDE UN EJB PORQUE
            //TIENE PROBLEMAS CON LA PERSISTENCIA


            EstadoObra eo = this.encontrarEstadoObra(estado);
            obra.setIdEstado(eo);


            Localizacion geo = new Localizacion();
            geo.setLatitud(latitudGeo);
            geo.setLongitud(longitudGeo);
            geo.setBarrio(barrioGeo.toUpperCase());
            geo.setCalle(calleGeo.toUpperCase());
            geo.setNumero(nroCalleGeo);
            geo.setZoom(zoomGeo);
            Localidad loc = this.encontrarLocalidadPorId(idLocalidadGeo);
            geo.setIdLocalidad(loc);
            persist(geo);
            obra.setIdLocalizacion(geo);


            ModalidadContratacion mo = encontrarModalidadContratacion(modalidad);
            obra.setIdModalidadContratacion(mo);
            Programa p = this.encontrarPrograma(programa);
            obra.setIdPrograma(p);

            TipoObra t = em.find(TipoObra.class, idTipoObra);
            obra.setIdTipoObra(t);
            SubtipoObra st = em.find(SubtipoObra.class, idSubtipoObra);
            obra.setIdSubtipoObra(st);

            obra.setMontoTotal(montoTotal);
            obra.setNombre(nombre.toUpperCase());
            obra.setNumeroExpediente(numeroExp);
            obra.setObservaciones(observaciones.toUpperCase());

            obra.setNroResolucion(nroResolucion.toUpperCase());
            obra.setFondos(fondos.toUpperCase());

            EmpresaContratista emp = this.encontrarEmpresa(razonEmp);
            Domicilio domEmp;
            if (emp == null) {
                emp = new EmpresaContratista();
                domEmp = new Domicilio();
            } else {
                domEmp = emp.getIdDomicilio();
            }
            emp.setCuit(cuitEmp);
            emp.setEmail(mailEmp.toUpperCase());
            emp.setPaginaWeb(paginaEmp.toUpperCase());
            emp.setTelefono(telefonoEmp);
            emp.setRazonSocial(razonEmp.toUpperCase());
            Pais pais = encontrarPais(paisEmp);
            emp.setIdPais(pais);
            domEmp.setBarrio(barrioEmp.toUpperCase());
            domEmp.setCalle(calleEmp.toUpperCase());
            domEmp.setCodPostal(codPostalEmp.toUpperCase());
            domEmp.setDepto(deptoEmp.toUpperCase());
            domEmp.setNumero(numeroCalleEmp);
            domEmp.setPiso(pisoEmp);
            persist(domEmp);
            emp.setIdDomicilio(domEmp);
            persist(emp);

            ResponsableObra respon = new ResponsableObra();
            respon.setApellido(apellidoRes.toUpperCase());
            respon.setNombre(nombreRes.toUpperCase());
            respon.setNumeroDocumento(dniRes);
            respon.setIdEmpresa(emp);
            TipoDocumento td = encontrarTipoDocumento(tipoDniRes.toUpperCase());
            respon.setIdTipoDocumento(td);
           
            Domicilio domRes = new Domicilio();
            domRes.setBarrio(barrioRes.toUpperCase());
            domRes.setCalle(calleRes.toUpperCase());
            domRes.setCodPostal(codPostalRes.toUpperCase());
            domRes.setDepto(deptoRes.toUpperCase());
            domRes.setNumero(numeroCalleRes);
            domRes.setPiso(pisoRes);
            Localidad localidadRes = em.find(datos.Localidad.class, idLocalidadEnc);
            domRes.setIdLocalidad(localidadRes);
            Pais paisRes = em.find(datos.Pais.class, idPaisEnc);
            domRes.setIdPais(paisRes);
            persist(domRes);

            respon.setIdDomicilio(domRes);
            persist(respon);

            obra.setIdResponsable(respon);
            obra.setIdEmpresa(emp);
            persist(obra);

            Contrato contrato = new Contrato();
            contrato.setFecha(fechaContrato);
            contrato.setIdEmpresaContratista(emp);
            contrato.setPlazo(plazo.toUpperCase());
            contrato.setTipoPlazo(tipoPlazo.toUpperCase());
            PeriodoCertificacion perioCert = this.encontrarPeriodoCertificacion(periodoContrato.toUpperCase());
            contrato.setIdPeriodoCertificacion(perioCert);
            contrato.setObservaciones(observacionesContrato.toUpperCase());
            contrato.setTitulo(tituloContrato.toUpperCase());
            contrato.setIdObra(obra);
            persist(contrato);

            em.flush();
            return obra.getId();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return -1;
        }
    }

    /***
     * Retorna true si existe alguna instancia de tipo Obra cuyo código coincida con el parametro codigo
     * y false en caso contrario.
     * @param codigo
     * @return true si existe alguna instancia de obra con código igual a "codigo"
     * y false en caso contrario
     * interfaz local
     */
    public boolean existeCodigoObra(String codigo) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findByCodigo");
            q.setParameter("codigo", codigo.toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorObraBean.log4j(ie);
            return true;
        }

    }

    /***
     * Retorna true si existe alguna instancia de tipo Obra cuyo código coincida con el parametro codigo
     * y false en caso contrario.
     * @param codigo
     * @return true si existe alguna instancia de obra con código igual a "codigo"
     * y false en caso contrario
     * interfaz remota
     */
    public boolean existeCodigoObraRemote(String codigo) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findByCodigo");
            q.setParameter("codigo", codigo.toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorObraBean.log4j(ie);
            return true;
        }

    }

    /***
     * Retorna true si existe alguna instancia de Obra cuyo codigo coincida con el
     * parametro codigo e Id distinto del parametro id y false en caso contrario.
     * Validando de esta forma que no se almacenen dos Obras con igual codigo.
     * @param codigo
     * @param id
     * @return true si existe alguna instancia de obra con codigo igual a "codigo"
     * e ID distinto de id y false en caso contrario
     * interfaz local
     */
    public boolean existeCodigoObraModificar(String codigo, int id) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findByCodigoModificar");
            q.setParameter("codigo", codigo.toUpperCase());
            q.setParameter("id", id);
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorObraBean.log4j(ie);
            return true;
        }
    }

    /***
     * Retorna true si existe alguna instancia de Obra cuyo codigo coincida con el
     * parametro codigo e Id distinto del parametro id y false en caso contrario.
     * Validando de esta forma que no se almacenen dos Obras con igual codigo.
     * @param codigo
     * @param id
     * @return true si existe alguna instancia de obra con codigo igual a "codigo"
     * e ID distinto de id y false en caso contrario
     * interfaz remota
     */
    public boolean existeCodigoObraModificarRemote(String codigo, int id) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findByCodigoModificar");
            q.setParameter("codigo", codigo.toUpperCase());
            q.setParameter("id", id);
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorObraBean.log4j(ie);
            return true;
        }
    }

    /***
     * Retorna true si existe alguna instancia de EmpresaContratista cuya razon coincida con el
     * parametro razon e Id distinto del parametro id y false en caso contrario.
     * Validando de esta forma que no se almacenen dos EmpresaContratista con igual razon.
     * @param razon
     * @param id
     * @return true si existe alguna instancia de empresa contratista con
     * razonSocial = razon y ID <> id. False en caso contrario
     * interfaz local
     */
    public boolean existeRazonEmpresaModificar(String razon, int id) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.findByEmpresaModificar");
            q.setParameter("razon", razon.toUpperCase());
            q.setParameter("id", id);
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorObraBean.log4j(ie);
            return true;
        }
    }

    /***
     * Retorna true si existe alguna instancia de EmpresaContratista cuya razon coincida con el
     * parametro razon e Id distinto del parametro id y false en caso contrario.
     * Validando de esta forma que no se almacenen dos EmpresaContratista con igual razon.
     * @param razon
     * @param id
     * @return true si existe alguna instancia de empresa contratista con
     * razonSocial = razon y ID <> id. False en caso contrario
     * interfaz remota
     */
    public boolean existeRazonEmpresaModificarRemote(String razon, int id) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.findByEmpresaModificar");
            q.setParameter("razon", razon.toUpperCase());
            q.setParameter("id", id);
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorObraBean.log4j(ie);
            return true;
        }
    }

    /***
     * Actualiza una instancia de tipo Obra, retornando true si la instancia de la Obra con ID igual al
     * parametro idObra es encontrada y actualizada exitosamente en la base de datos y false en caso contrario.
     * @param idObra
     * @param codigo
     * @param anticipo
     * @param descripcion
     * @param fechaInicioEst
     * @param fechaInicioReal
     * @param fechaFinEst
     * @param fechaFinReal
     * @param estado
     * @param modalidad
     * @param programa
     * @param idTipoObra
     * @param idSubtipoObra
     * @param montoTotal
     * @param nombre
     * @param numeroExp
     * @param observaciones
     * @param nroResolucion
     * @param fondos
     * @param idEmp
     * @param cuitEmp
     * @param mailEmp
     * @param paginaEmp
     * @param telefonoEmp
     * @param razonEmp
     * @param paisEmp
     * @param barrioEmp
     * @param calleEmp
     * @param codPostalEmp
     * @param deptoEmp
     * @param numeroCalleEmp
     * @param pisoEmp
     * @param idRes
     * @param apellidoRes
     * @param nombreRes
     * @param dniRes
     * @param tipoDniRes
     * @param barrioRes
     * @param calleRes
     * @param codPostalRes
     * @param deptoRes
     * @param numeroCalleRes
     * @param pisoRes
     * @param fechaContrato
     * @param tituloContrato
     * @param plazo
     * @param tipoPlazo
     * @param periodoContrato
     * @param observacionesContrato
     * @param calleGeo
     * @param nroCalleGeo
     * @param barrioGeo
     * @param idLocalidadGeo
     * @param latitudGeo
     * @param longitudGeo
     * @param zoomGeo
     * @return true si la instancia de la obra con ID igual a idObra es encontrada y actualizada
     * exitosamente en la base de datos y false en caso contrario
     * interfaz local
     */
    public boolean modificarObra(int idObra, String codigo, BigDecimal anticipo, String descripcion, Date fechaInicioEst,
            Date fechaInicioReal, Date fechaFinEst, Date fechaFinReal, String estado, String modalidad, String programa,
            int idTipoObra, int idSubtipoObra, BigDecimal montoTotal, String nombre, int numeroExp, String observaciones,
            String nroResolucion, String fondos, int idEmp, String cuitEmp, String mailEmp,
            String paginaEmp, String telefonoEmp, String razonEmp, String paisEmp, String barrioEmp, String calleEmp,
            String codPostalEmp, String deptoEmp, String numeroCalleEmp, int pisoEmp,
            int idRes, String apellidoRes, String nombreRes, int dniRes, String tipoDniRes, String barrioRes, String calleRes,
            String codPostalRes, String deptoRes, String numeroCalleRes, int pisoRes, Date fechaContrato, String tituloContrato,
            String plazo, String tipoPlazo, String periodoContrato, String observacionesContrato, String calleGeo, String nroCalleGeo,
            String barrioGeo, int idLocalidadGeo, String latitudGeo, String longitudGeo, int zoomGeo, int idLocalidadEnc, int idPaisEnc) {

        try {
            Obra obra = em.find(Obra.class, idObra);
            obra.setAnticipoFinanciero(anticipo);
            obra.setCodigo(codigo.toUpperCase());
            obra.setDescripcion(descripcion.toUpperCase());
            obra.setFechaFinEstimada(fechaFinEst);
            obra.setFechaFinReal(fechaFinReal);
            obra.setFechaInicioEstimada(fechaInicioEst);
            obra.setFechaInicioReal(fechaInicioReal);


            //NO PONER REFERENCIAS A OTRO EJB DESDE UN EJB PORQUE
            //TIENE PROBLEMAS CON LA PERSISTENCIA


            EstadoObra eo = this.encontrarEstadoObra(estado);
            obra.setIdEstado(eo);
            Localizacion geo;
            if (obra.getIdLocalizacion() == null) {
                geo = new Localizacion();
            } else {
                geo = obra.getIdLocalizacion();
            }

            geo.setLatitud(latitudGeo);
            geo.setLongitud(longitudGeo);
            geo.setBarrio(barrioGeo.toUpperCase());
            geo.setCalle(calleGeo.toUpperCase());
            geo.setNumero(nroCalleGeo);
            geo.setZoom(zoomGeo);
            Localidad loc = this.encontrarLocalidadPorId(idLocalidadGeo);
            geo.setIdLocalidad(loc);
            persist(geo);
            obra.setIdLocalizacion(geo);


            ModalidadContratacion mo = encontrarModalidadContratacion(modalidad);
            obra.setIdModalidadContratacion(mo);
            Programa p = this.encontrarPrograma(programa);
            obra.setIdPrograma(p);
            TipoObra t = em.find(TipoObra.class, idTipoObra);
            obra.setIdTipoObra(t);
            SubtipoObra st = em.find(SubtipoObra.class, idSubtipoObra);
            obra.setIdSubtipoObra(st);

            obra.setMontoTotal(montoTotal);
            obra.setNombre(nombre.toUpperCase());
            obra.setNumeroExpediente(numeroExp);
            obra.setObservaciones(observaciones.toUpperCase());

            obra.setNroResolucion(nroResolucion.toUpperCase());
            obra.setFondos(fondos.toUpperCase());

            EmpresaContratista emp = this.encontrarEmpresa(razonEmp);

            Domicilio domEmp;
            if (emp == null) {
                emp = new EmpresaContratista();
                domEmp = new Domicilio();
            } else {
                domEmp = emp.getIdDomicilio();
            }
            emp.setCuit(cuitEmp);
            emp.setEmail(mailEmp.toUpperCase());
            emp.setPaginaWeb(paginaEmp.toUpperCase());
            emp.setTelefono(telefonoEmp);
            emp.setRazonSocial(razonEmp.toUpperCase());
            Pais pais = encontrarPais(paisEmp);
            emp.setIdPais(pais);
            domEmp.setBarrio(barrioEmp.toUpperCase());
            domEmp.setCalle(calleEmp.toUpperCase());
            domEmp.setCodPostal(codPostalEmp.toUpperCase());
            domEmp.setDepto(deptoEmp.toUpperCase());
            domEmp.setNumero(numeroCalleEmp);
            domEmp.setPiso(pisoEmp);
            persist(domEmp);
            emp.setIdDomicilio(domEmp);
            persist(emp);

            ResponsableObra respon = em.find(ResponsableObra.class, idRes);
            respon.setApellido(apellidoRes.toUpperCase());
            respon.setNombre(nombreRes.toUpperCase());
            respon.setNumeroDocumento(dniRes);
            respon.setIdEmpresa(emp);
            TipoDocumento td = encontrarTipoDocumento(tipoDniRes.toUpperCase());
            respon.setIdTipoDocumento(td);

            Domicilio domRes = new Domicilio();
            domRes.setBarrio(barrioRes.toUpperCase());
            domRes.setCalle(calleRes.toUpperCase());
            domRes.setCodPostal(codPostalRes.toUpperCase());
            domRes.setDepto(deptoRes.toUpperCase());
            domRes.setNumero(numeroCalleRes);
            domRes.setPiso(pisoRes);

             Localidad localidadRes = em.find(datos.Localidad.class, idLocalidadEnc);
            domRes.setIdLocalidad(localidadRes);
            Pais paisRes = em.find(datos.Pais.class, idPaisEnc);
            domRes.setIdPais(paisRes);
            persist(domRes);
            respon.setIdDomicilio(domRes);


            persist(domRes);
            respon.setIdDomicilio(domRes);
            persist(respon);
            obra.setIdResponsable(respon);
            obra.setIdEmpresa(emp);
            persist(obra);

            Contrato contrato = this.encontrarContratoPorEmpresa(emp.getId(), obra.getId());
            if (contrato == null) {
                contrato = new Contrato();
            }
            contrato.setFecha(fechaContrato);
            contrato.setIdEmpresaContratista(emp);
            contrato.setPlazo(plazo.toUpperCase());
            contrato.setTipoPlazo(tipoPlazo.toUpperCase());
            PeriodoCertificacion perioCert = this.encontrarPeriodoCertificacion(periodoContrato.toUpperCase());
            contrato.setIdPeriodoCertificacion(perioCert);
            contrato.setObservaciones(observacionesContrato.toUpperCase());
            contrato.setTitulo(tituloContrato.toUpperCase());
            contrato.setIdObra(obra);
            persist(contrato);

            em.flush();

            return true;
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return false;
        }

    }

    /***
     * Actualiza una instancia de tipo Obra, retornando true si la instancia de la Obra con ID igual al
     * parametro idObra es encontrada y actualizada exitosamente en la base de datos y false en caso contrario.
     * @param idObra
     * @param codigo
     * @param anticipo
     * @param descripcion
     * @param fechaInicioEst
     * @param fechaInicioReal
     * @param fechaFinEst
     * @param fechaFinReal
     * @param estado
     * @param modalidad
     * @param programa
     * @param idTipoObra
     * @param idSubtipoObra
     * @param montoTotal
     * @param nombre
     * @param numeroExp
     * @param observaciones
     * @param nroResolucion
     * @param fondos
     * @param idEmp
     * @param cuitEmp
     * @param mailEmp
     * @param paginaEmp
     * @param telefonoEmp
     * @param razonEmp
     * @param paisEmp
     * @param barrioEmp
     * @param calleEmp
     * @param codPostalEmp
     * @param deptoEmp
     * @param numeroCalleEmp
     * @param pisoEmp
     * @param idRes
     * @param apellidoRes
     * @param nombreRes
     * @param dniRes
     * @param tipoDniRes
     * @param barrioRes
     * @param calleRes
     * @param codPostalRes
     * @param deptoRes
     * @param numeroCalleRes
     * @param pisoRes
     * @param fechaContrato
     * @param tituloContrato
     * @param plazo
     * @param tipoPlazo
     * @param periodoContrato
     * @param observacionesContrato
     * @param calleGeo
     * @param nroCalleGeo
     * @param barrioGeo
     * @param idLocalidadGeo
     * @param latitudGeo
     * @param longitudGeo
     * @param zoomGeo
     * @return true si la instancia de la obra con ID igual a idObra es encontrada y actualizada
     * exitosamente en la base de datos y false en caso contrario
     * interfaz remota
     */
    public boolean modificarObraRemote(int idObra, String codigo, BigDecimal anticipo, String descripcion, Date fechaInicioEst,
            Date fechaInicioReal, Date fechaFinEst, Date fechaFinReal, String estado, String modalidad, String programa,
            int idTipoObra, int idSubtipoObra, BigDecimal montoTotal, String nombre, int numeroExp, String observaciones,
            String nroResolucion, String fondos, int idEmp, String cuitEmp, String mailEmp,
            String paginaEmp, String telefonoEmp, String razonEmp, String paisEmp, String barrioEmp, String calleEmp,
            String codPostalEmp, String deptoEmp, String numeroCalleEmp, int pisoEmp,
            int idRes, String apellidoRes, String nombreRes, int dniRes, String tipoDniRes, String barrioRes, String calleRes,
            String codPostalRes, String deptoRes, String numeroCalleRes, int pisoRes, Date fechaContrato, String tituloContrato,
            String plazo, String tipoPlazo, String periodoContrato, String observacionesContrato, String calleGeo, String nroCalleGeo,
            String barrioGeo, int idLocalidadGeo, String latitudGeo, String longitudGeo, int zoomGeo, int idLocalidadEnc, int idPaisEnc) {

        try {
            Obra obra = em.find(Obra.class, idObra);
            obra.setAnticipoFinanciero(anticipo);
            obra.setCodigo(codigo.toUpperCase());
            obra.setDescripcion(descripcion.toUpperCase());
            obra.setFechaFinEstimada(fechaFinEst);
            obra.setFechaFinReal(fechaFinReal);
            obra.setFechaInicioEstimada(fechaInicioEst);
            obra.setFechaInicioReal(fechaInicioReal);


            //NO PONER REFERENCIAS A OTRO EJB DESDE UN EJB PORQUE
            //TIENE PROBLEMAS CON LA PERSISTENCIA


            EstadoObra eo = this.encontrarEstadoObra(estado);
            obra.setIdEstado(eo);
            Localizacion geo;
            if (obra.getIdLocalizacion() == null) {
                geo = new Localizacion();
            } else {
                geo = obra.getIdLocalizacion();
            }

            geo.setLatitud(latitudGeo);
            geo.setLongitud(longitudGeo);
            geo.setBarrio(barrioGeo.toUpperCase());
            geo.setCalle(calleGeo.toUpperCase());
            geo.setNumero(nroCalleGeo);
            geo.setZoom(zoomGeo);
            Localidad loc = this.encontrarLocalidadPorId(idLocalidadGeo);
            geo.setIdLocalidad(loc);
            persist(geo);
            obra.setIdLocalizacion(geo);


            ModalidadContratacion mo = encontrarModalidadContratacion(modalidad);
            obra.setIdModalidadContratacion(mo);
            Programa p = this.encontrarPrograma(programa);
            obra.setIdPrograma(p);
            TipoObra t = em.find(TipoObra.class, idTipoObra);
            obra.setIdTipoObra(t);
            SubtipoObra st = em.find(SubtipoObra.class, idSubtipoObra);
            obra.setIdSubtipoObra(st);

            obra.setMontoTotal(montoTotal);
            obra.setNombre(nombre.toUpperCase());
            obra.setNumeroExpediente(numeroExp);
            obra.setObservaciones(observaciones.toUpperCase());

            obra.setNroResolucion(nroResolucion.toUpperCase());
            obra.setFondos(fondos.toUpperCase());

            EmpresaContratista emp = this.encontrarEmpresa(razonEmp);
           
            Domicilio domEmp;
            if (emp == null) {
                emp = new EmpresaContratista();
                domEmp = new Domicilio();
            } else {
                domEmp = emp.getIdDomicilio();
            }
            emp.setCuit(cuitEmp);
            emp.setEmail(mailEmp.toUpperCase());
            emp.setPaginaWeb(paginaEmp.toUpperCase());
            emp.setTelefono(telefonoEmp);
            emp.setRazonSocial(razonEmp.toUpperCase());
            Pais pais = encontrarPais(paisEmp);
            emp.setIdPais(pais);
            domEmp.setBarrio(barrioEmp.toUpperCase());
            domEmp.setCalle(calleEmp.toUpperCase());
            domEmp.setCodPostal(codPostalEmp.toUpperCase());
            domEmp.setDepto(deptoEmp.toUpperCase());
            domEmp.setNumero(numeroCalleEmp);
            domEmp.setPiso(pisoEmp);
            persist(domEmp);
            emp.setIdDomicilio(domEmp);
            persist(emp);

            ResponsableObra respon = em.find(ResponsableObra.class, idRes);
            respon.setApellido(apellidoRes.toUpperCase());
            respon.setNombre(nombreRes.toUpperCase());
            respon.setNumeroDocumento(dniRes);
            respon.setIdEmpresa(emp);
            TipoDocumento td = encontrarTipoDocumento(tipoDniRes.toUpperCase());
            respon.setIdTipoDocumento(td);
          
            Domicilio domRes = new Domicilio();
            domRes.setBarrio(barrioRes.toUpperCase());
            domRes.setCalle(calleRes.toUpperCase());
            domRes.setCodPostal(codPostalRes.toUpperCase());
            domRes.setDepto(deptoRes.toUpperCase());
            domRes.setNumero(numeroCalleRes);
            domRes.setPiso(pisoRes);

             Localidad localidadRes = em.find(datos.Localidad.class, idLocalidadEnc);
            domRes.setIdLocalidad(localidadRes);
            Pais paisRes = em.find(datos.Pais.class, idPaisEnc);
            domRes.setIdPais(paisRes);
            persist(domRes);
            respon.setIdDomicilio(domRes);


            persist(domRes);
            respon.setIdDomicilio(domRes);
            persist(respon);
            obra.setIdResponsable(respon);
            obra.setIdEmpresa(emp);
            persist(obra);

            Contrato contrato = this.encontrarContratoPorEmpresa(emp.getId(), obra.getId());
            if (contrato == null) {
                contrato = new Contrato();
            }
            contrato.setFecha(fechaContrato);
            contrato.setIdEmpresaContratista(emp);
            contrato.setPlazo(plazo.toUpperCase());
            contrato.setTipoPlazo(tipoPlazo.toUpperCase());
            PeriodoCertificacion perioCert = this.encontrarPeriodoCertificacion(periodoContrato.toUpperCase());
            contrato.setIdPeriodoCertificacion(perioCert);
            contrato.setObservaciones(observacionesContrato.toUpperCase());
            contrato.setTitulo(tituloContrato.toUpperCase());
            contrato.setIdObra(obra);
            persist(contrato);

            em.flush();

            return true;
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return false;
        }

    }

    /***
     * Retorna una lista con todos los nombres de Obra.
     * @return lista con todos los nombres de las obras almacenadas en la base de datos
     * y null en caso contrario
     * interfaz local
     */
    public List obras() {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.encontrarTodosNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todos los nombres de Obra.
     * @return lista con todos los nombres de las obras almacenadas en la base de datos
     * y null en caso contrario
     * interfaz remota
     */
    public List obrasRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.encontrarTodosNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todas las instancias de Obra.
     * @return lista de todas las instancias de Obra almacenadas en la
     * base de datos y null en caso contrario
     * interfaz local
     */
    public List consultarObras() {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findAll");
            return q.getResultList();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todas las instancias de Obra.
     * @return lista de todas las instancias de Obra almacenadas en la
     * base de datos y null en caso contrario
     * interfaz remota
     */
    public List consultarObrasRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findAll");
            return q.getResultList();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una instancia de tipo Obra, cuyo id coincida con el parametro id.
     * @param id
     * @return instancia de Obra con ID igual a id y null en caso contrario
     * interfaz local
     */
    public Obra encontrarObraPublicaPorId(int id) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findById");
            q.setParameter("id", id);
            return (Obra) q.getSingleResult();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una instancia de tipo Obra, cuyo id coincida con el parametro id.
     * @param id
     * @return instancia de Obra con ID igual a id y null en caso contrario
     * interfaz remota
     */
    public Obra encontrarObraPublicaPorIdRemote(int id) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.findById");
            q.setParameter("id", id);
            return (Obra) q.getSingleResult();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una instancia de tipo EmpresaContratista, cuyo id coincida con el parametro id.
     * @param id
     * @return instancia de Empresa Contratista con ID igual a id
     * y null en caso contrario
     * interfaz local
     */
    public EmpresaContratista encontrarEmpresaPorId(int id) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.findById");
            q.setParameter("id", id);
            return (EmpresaContratista) q.getSingleResult();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una instancia de tipo EmpresaContratista, cuyo id coincida con el parametro id.
     * @param id
     * @return instancia de Empresa Contratista con ID igual a id
     * y null en caso contrario
     * interfaz remota
     */
    public EmpresaContratista encontrarEmpresaPorIdRemote(int id) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.findById");
            q.setParameter("id", id);
            return (EmpresaContratista) q.getSingleResult();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una instancia de tipo TipoObra, cuyo nombre coincida con el parametro nombre.
     * @param nombre
     * @return instancia de Tipo de Obra con nombre igual a "nombre"
     * y null en caso contrario
     * interfaz local
     */
    public TipoObra encontrarTipoObra(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("TipoObra.findByNombre");
            q.setParameter("nombre", nombre);
            return (TipoObra) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna una instancia de tipo Programa, cuyo nombre coincida con el parametro nombre.
     * @param nombre
     * @return instancia de Programa con nombre igual a "nombre"
     * y null en caso contrario
     * interfaz local
     */
    public Programa encontrarPrograma(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Programa.buscarPorNombre");
            q.setParameter("nombre", nombre);
            return (Programa) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna una instancia de tipo EstadoObra, cuyo nombre coincida con el parametro nombre.
     * @param nombre
     * @return instancia de Estado de Obra con nombre igual a "nombre"
     * y null en caso contrario
     * interfaz local
     */
    public EstadoObra encontrarEstadoObra(String nombre) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EstadoObra.findByNombre");
            q.setParameter("nombre", nombre);
            return (EstadoObra) q.getSingleResult();

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }

    }

   
    /***
     * Actualiza una instancia de tipo EmpresaContratista, sus atributos
     * y relaciones a otras clases. Retorna True en caso de exito y False en caso contrario
     * @param idEmp
     * @param cuitEmp
     * @param mailEmp
     * @param paginaEmp
     * @param telefonoEmp
     * @param razonEmp
     * @param paisEmp
     * @param barrioEmp
     * @param calleEmp
     * @param codPostalEmp
     * @param deptoEmp
     * @param numeroCalleEmp
     * @param pisoEmp
     * @return true si existe una empresa contratista con ID igual a idEmp y actualizada con sus atributos
     * y relaciones a otras clases. False en caso contrario
     * interfaz remota
     */
    public boolean modificarEmpresaRemote(int idEmp, String cuitEmp,
            String mailEmp, String paginaEmp,
            String telefonoEmp, String razonEmp,
            String paisEmp, String barrioEmp,
            String calleEmp, String codPostalEmp,
            String deptoEmp, String numeroCalleEmp,
            int pisoEmp) {

        try {
            EmpresaContratista empresa = em.find(EmpresaContratista.class, idEmp);
            empresa.setCuit(cuitEmp);
            empresa.setEmail(mailEmp.toUpperCase());
            empresa.setPaginaWeb(paginaEmp.toUpperCase());
            empresa.setRazonSocial(razonEmp.toUpperCase());
            empresa.setTelefono(telefonoEmp);
            Domicilio domEmp;
            if (empresa == null) {
                empresa = new EmpresaContratista();
                domEmp = new Domicilio();
            } else {
                domEmp = empresa.getIdDomicilio();
            }
            Pais pais = encontrarPais(paisEmp);
            empresa.setIdPais(pais);
            domEmp.setBarrio(barrioEmp.toUpperCase());
            domEmp.setCalle(calleEmp.toUpperCase());
            domEmp.setCodPostal(codPostalEmp.toUpperCase());
            domEmp.setDepto(deptoEmp.toUpperCase());
            domEmp.setNumero(numeroCalleEmp);
            domEmp.setPiso(pisoEmp);
            persist(domEmp);
            empresa.setIdDomicilio(domEmp);
            persist(empresa);

            em.flush();
            return true;
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return false;
        }

    }

    /***
     * Actualiza una instancia de tipo EmpresaContratista, sus atributos
     * y relaciones a otras clases. Retorna True en caso de exito y False en caso contrario.
     * @param idEmp
     * @param cuitEmp
     * @param mailEmp
     * @param paginaEmp
     * @param telefonoEmp
     * @param razonEmp
     * @param paisEmp
     * @param barrioEmp
     * @param calleEmp
     * @param codPostalEmp
     * @param deptoEmp
     * @param numeroCalleEmp
     * @param pisoEmp
     * @return true si existe una empresa contratista con ID igual a idEmp y actualizada con sus atributos
     * y relaciones a otras clases. False en caso contrario
     * interfaz local
     */
    public boolean modificarEmpresa(int idEmp, String cuitEmp,
            String mailEmp, String paginaEmp,
            String telefonoEmp, String razonEmp,
            String paisEmp, String barrioEmp,
            String calleEmp, String codPostalEmp,
            String deptoEmp, String numeroCalleEmp,
            int pisoEmp) {

        try {
            EmpresaContratista empresa = em.find(EmpresaContratista.class, idEmp);
            empresa.setCuit(cuitEmp);
            empresa.setEmail(mailEmp.toUpperCase());
            empresa.setPaginaWeb(paginaEmp.toUpperCase());
            empresa.setRazonSocial(razonEmp.toUpperCase());
            empresa.setTelefono(telefonoEmp);
            Domicilio domEmp;
            if (empresa == null) {
                empresa = new EmpresaContratista();
                domEmp = new Domicilio();
            } else {
                domEmp = empresa.getIdDomicilio();
            }
            Pais pais = encontrarPais(paisEmp);
            empresa.setIdPais(pais);
            domEmp.setBarrio(barrioEmp.toUpperCase());
            domEmp.setCalle(calleEmp.toUpperCase());
            domEmp.setCodPostal(codPostalEmp.toUpperCase());
            domEmp.setDepto(deptoEmp.toUpperCase());
            domEmp.setNumero(numeroCalleEmp);
            domEmp.setPiso(pisoEmp);
            persist(domEmp);
            empresa.setIdDomicilio(domEmp);
            persist(empresa);

            em.flush();
            return true;
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return false;
        }

    }

    /***
     *
     * @param id
     * @return
     */
     public boolean eliminarObraRemote(int id) {
        try{
            Obra obra = em.find(Obra.class, id);
            obra.setEliminada(true);
            em.flush();
            return true;

        }catch (Exception e){
            GestorObraBean.log4j(e);
            return false;
        }
    }

     /***
      *
      * @param id
      * @return
      */
     public boolean eliminarObra(int id){
      try{
            Obra obra = em.find(Obra.class, id);
            obra.setEliminada(true);
            em.flush();
            return true;

        }catch (Exception e){
            GestorObraBean.log4j(e);
            return false;
        }
     }

    /***
     * Valida la existencia de alguna instancia de EmpresaContratista cuya razon
     * coincida con el parametro razon. Retornando True en caso de que exista y False
     * en caso contrario.
     * @param razon
     * @return true si existe alguna Empresa Contratista con razon social igual a razon
     * y false en caso contrario
     * interfaz remota
     */
    public boolean existeRazonSocialRemote(String razon) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.findByRazonSocial");
            q.setParameter("razon", razon.toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorObraBean.log4j(ie);
            return true;
        }

    }

    /***
     * Valida la existencia de alguna instancia de EmpresaContratista cuya razon
     * coincida con el parametro razon. Retornando True en caso de que exista y False
     * en caso contrario.
     * @param razon
     * @return true si existe alguna Empresa Contratista con razon social igual a razon
     * y false en caso contrario
     * interfaz local
     */
    public boolean existeRazonSocial(String razon) {
        try {
            javax.persistence.Query q = em.createNamedQuery("EmpresaContratista.findByRazonSocial");
            q.setParameter("razon", razon.toUpperCase());
            if (q.getSingleResult() != null) {
                return true;
            } else {
                return false;
            }
        } catch (NoResultException ne) {
            GestorObraBean.log4j(ne);
            return false;
        } catch (NonUniqueResultException nue) {
            GestorObraBean.log4j(nue);
            return true;
        } catch (IllegalStateException ie) {
            GestorObraBean.log4j(ie);
            return true;
        }

    }

    /***
     * Agrega una nueva instancia de EmpresaContratista, con sus atributos y relaciones con otras clases.
     * Retornando True en caso de exito y False en caso contrario.
     * @param cuit
     * @param razonSocial
     * @param email
     * @param pagina
     * @param telefono
     * @param calle
     * @param numero
     * @param depto
     * @param piso
     * @param barrio
     * @param codPostal
     * @param paisEmp
     * @return true si la nueva instancia de Empresa Contratista ha sido persistida en la
     * base de datos exitosamente, con sus atributos y relaciones con otras clases. False
     * en caso contrario
     * interfaz remota
     */
    public boolean agregarEmpresaRemote(String cuit, String razonSocial,
            String email, String pagina, String telefono, String calle, String numero, String depto,
            int piso, String barrio, String codPostal, String paisEmp) {
        try {
            EmpresaContratista emp = new EmpresaContratista();
            emp.setCuit(cuit);
            emp.setEmail(email.toUpperCase());
            emp.setPaginaWeb(pagina.toUpperCase());
            emp.setRazonSocial(razonSocial.toUpperCase());
            emp.setTelefono(telefono);
            Domicilio domEmp = new Domicilio();

            Pais pais = this.encontrarPaisRemote(paisEmp);

            emp.setIdPais(pais);
            domEmp.setBarrio(barrio.toUpperCase());
            domEmp.setCalle(calle.toUpperCase());
            domEmp.setCodPostal(codPostal.toUpperCase());
            domEmp.setDepto(depto.toUpperCase());
            domEmp.setNumero(numero);
            domEmp.setPiso(piso);
            persist(domEmp);
            emp.setIdDomicilio(domEmp);
            persist(emp);

            em.flush();
            return true;

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Agrega una nueva instancia de EmpresaContratista, con sus atributos y relaciones con otras clases.
     * Retornando True en caso de exito y False en caso contrario.
     * @param cuit
     * @param razonSocial
     * @param email
     * @param pagina
     * @param telefono
     * @param calle
     * @param numero
     * @param depto
     * @param piso
     * @param barrio
     * @param codPostal
     * @param paisEmp
     * @return true si la nueva instancia de Empresa Contratista ha sido persistida en la
     * base de datos exitosamente, con sus atributos y relaciones con otras clases. False
     * en caso contrario
     * interfaz local
     */
    public boolean agregarEmpresa(String cuit, String razonSocial,
            String email, String pagina, String telefono, String calle, String numero, String depto,
            int piso, String barrio, String codPostal, String paisEmp) {
        try {
            EmpresaContratista emp = new EmpresaContratista();
            emp.setCuit(cuit);
            emp.setEmail(email.toUpperCase());
            emp.setPaginaWeb(pagina.toUpperCase());
            emp.setRazonSocial(razonSocial.toUpperCase());
            emp.setTelefono(telefono);
            Domicilio domEmp = new Domicilio();

            Pais pais = this.encontrarPaisRemote(paisEmp);

            emp.setIdPais(pais);
            domEmp.setBarrio(barrio.toUpperCase());
            domEmp.setCalle(calle.toUpperCase());
            domEmp.setCodPostal(codPostal.toUpperCase());
            domEmp.setDepto(depto.toUpperCase());
            domEmp.setNumero(numero);
            domEmp.setPiso(piso);
            persist(domEmp);
            emp.setIdDomicilio(domEmp);
            persist(emp);

            em.flush();
            return true;

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Elimina una instancia de EmpresaContratista.
     * retorna True en caso de exito y False en caso contrario.
     * @param e
     * @return true la instancia de la Empresa Contratista es encontrada
     * y removida fisicamente de la base de datos con éxito
     * false en caso contrario
     * interfaz local
     */
    public boolean eliminarEmpresa(EmpresaContratista e) {
        try {
            EmpresaContratista pro = em.find(EmpresaContratista.class, e.getId());
            em.remove(pro);
            return true;
        } catch (Exception ex) {
            GestorObraBean.log4j(ex);
            return false;
        }
    }

    /***
     * Elimina una instancia de EmpresaContratista.
     * retorna True en caso de exito y False en caso contrario.
     * @param e
     * @return true la instancia de la Empresa Contratista es encontrada
     * y removida fisicamente de la base de datos con éxito
     * false en caso contrario
     * interfaz remota
     */
    public boolean eliminarEmpresaRemote(EmpresaContratista e) {
        try {
            EmpresaContratista pro = em.find(EmpresaContratista.class, e.getId());
            em.remove(pro);
            return true;
        } catch (Exception ex) {
            GestorObraBean.log4j(ex);
            return false;
        }
    }

    /***
     * Valida si existe alguna instancia de EmpresaContratista cuyo ID coincida con el
     * parametro idEmpresa relacionada con alguna instancia de Obra.
     * Retorna True en caso de existir al menos una y False en caso contrario.
     * @param idEmpresa
     * @return true si existe una empresa contratista con ID igual a idEmpresa
     * relacionada con alguna instancia de obra y false en caso contrario
     * interfaz local
     */
    public boolean empresaTieneObrasAsignadas(int idEmpresa) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.empresaTieneObras");
            q.setParameter("idEmpresa", idEmpresa);
            if (q.getResultList() != null) {
                if (q.getResultList().size() > 0) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Valida si existe alguna instancia de EmpresaContratista cuyo ID coincida con el
     * parametro idEmpresa relacionada con alguna instancia de Obra.
     * Retorna True en caso de existir al menos una y False en caso contrario.
     * @param idEmpresa
     * @return true si existe una empresa contratista con ID igual a idEmpresa
     * relacionada con alguna instancia de obra y false en caso contrario
     * interfaz remota
     */
    public boolean empresaTieneObrasAsignadasRemote(int idEmpresa) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Obra.empresaTieneObras");
            q.setParameter("idEmpresa", idEmpresa);
            if (q.getResultList() != null) {
                if (q.getResultList().size() > 0) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }

        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return false;
        }
    }

    /***
     * Retorna una lista con todos los nombres de las instancias de SubtipoObra, cuyo idTipoObra
     * coincida con el parametro idTipoObra.
     * @param nombreTipoObra
     * @return lista con todos los nombres ordenados de SubtipoObra con idTipoObra = idTipoObra
     * y null en caso contrario
     * interfaz local
     */
    public List subtiposPorTipoObra(String nombreTipoObra) {
        try {
            TipoObra t = this.encontrarTipoObra(nombreTipoObra.toUpperCase());
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.encontrarNombreSubTiposPorTipo");
            q.setParameter("idTipoObra", t.getId());
            return q.getResultList();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna una lista con todos los nombres de las instancias de SubtipoObra, cuyo idTipoObra
     * coincida con el parametro idTipoObra.
     * @param nombreTipoObra
     * @return ista con todos los nombres ordenados de SubtipoObra con idTipoObra = idTipoObra
     * y null en caso contrario
     * interfaz remota
     */
    public List subtiposPorTipoObraRemote(String nombreTipoObra) {
        try {
            TipoObra t = this.encontrarTipoObra(nombreTipoObra.toUpperCase());
            javax.persistence.Query q = em.createNamedQuery("SubtipoObra.encontrarNombreSubTiposPorTipo");
            q.setParameter("idTipoObra", t.getId());
            return q.getResultList();
        } catch (Exception e) {
            GestorObraBean.log4j(e);
            return null;
        }
    }


}
